import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.TreeSet;


/*
 * Inventory är en arraylist där varje item läggs till som ett objekt.
 * Varje potion du har är ett separat element i inventorylistan, men
 * addItem och removeItem tar hand om att behandla dem som om de vore
 * ett item.
 */
public class Inventory {
	private ArrayList<ItemKind> items;
	
	public Inventory() {
		items = new ArrayList<ItemKind>();
	}
	
	public Inventory(ArrayList<ItemKind> items) {
		this.items = items;
	}
	
	public Inventory copy() {
		return new Inventory(items);
	}
	
	/*
	 * getItems() returnerar varje typ av föremål i inventoryt i
	 * en ArrayList. Tex om inventoryt är
	 *     [potion, potion, ether, potion, ether ether potion]
	 * så kommer getItems returnera
	 *     [potion, ether]
	 */
	public ArrayList<ItemKind> getItems() {
		TreeSet<ItemKind> uniqueItems = new TreeSet<ItemKind>(items);
		return new ArrayList<ItemKind>(uniqueItems);
	}
	
	public ArrayList<ItemKind> getEffectItems() {
		TreeSet<ItemKind> uniqueItems = new TreeSet<ItemKind>();
		for (ItemKind item : items) {
			if (new Item(item).effect != null) {
				uniqueItems.add(item);
			}
		}
		return new ArrayList<ItemKind>(uniqueItems);
	}
	
	/*
	 * addItem lägger till valfritt antal av ett item i inventoryt.
	 * Antal under 1 gör ingen skillnad på inventoryt.
	 * Exempel:
	 *     potion = new Potion(1);
	 *     addItem(potion, 3); // lägger till tre potions
	 * ArrayListens innehåll innan och efter ovanstående:
	 * Innan: [Potion(1), Ether(2), EscapeRope(1)]
	 * Efter: [Potion(1), Ether(2), EscapeRope(1), Potion(1), Potion(1), Potion(1)]
	 */
	public void addItem(ItemKind itemKind, int amount) {
		for (int i = 0; i < amount; i++) {
			items.add(itemKind);
		}
	}

	/*
	 * removeItem tar bort valfritt antal av ett item i inventoryt.
	 * Antal under 1 gör ingen skillnad på inventoryt.
	 * Exempel:
	 *     potion = new Potion(1);
	 *     removeItem(potion, 5); // tar bort fem potions
	 * ArrayListens innehåll innan och efter ovanstående:
	 * Innan: [Potion(1), Ether(2), EscapeRope(1), Potion(1), Potion(1), Potion(1)]
	 * Efter: [Ether(2), EscapeRope(1)]
	 */
	public void removeItem(ItemKind itemKind, int amount) {
		for (int i = 0; i < amount; i++) {
			items.remove(itemKind);
		}
	}
	
	/*
	 * itemCount räknar antalet items av en viss typ i inventoryt.
	 * 
	 * Om ArrayListen är
	 *     [Potion(1), Ether(2), EscapeRope(1), Potion(1), Potion(1), Potion(1)]
	 * så kommer följande
	 *     potion = new Potion(1);
	 *     x = itemCount(potion);
	 * göra så att x = 4.
	 */
	public int itemCount(ItemKind itemKind) {
		return Collections.frequency(items, itemKind);
	}
}
